Scroll to navigation

CHMOD(2) Linux Programmer's Manual CHMOD(2)

名前

chmod, fchmod - ファイルのモードを変更する

書式

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);


glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

fchmod(): _BSD_SOURCE || _XOPEN_SOURCE >= 500

説明

これらのシステムコールはファイルのアクセス許可 (permission) を変更する。 システムコール間の違いは、ファイルの指定の仕方だけである。

  • chmod() は、 path で指定されたパス名を持つファイルの許可を変更する。 path がシンボリック・リンクの場合は、リンクの展開が行われる。
  • fchmod() は、オープンされたファイルディスクリプタ fd により参照されるファイルの許可を変更する。

新しいファイル許可は mode で指定される。 mode は、以下に示す値の 0 個以上の OR (論理和) をとって作成される ビットマスクである。

set-user-ID (execve(2) 時にプロセスの実効ユーザ ID にセットされる)
set-group-ID (以下の場合に (execve(2) 実行時にプロセスの実効グループ ID にセットされる、 強制ロック (mandatory locking) を行う (fcntl(2) の説明を参照)、 新しいファイルのグループとして親ディレクトリと同じものを使う (chown(2)(mkdir(2) の説明を参照)
スティッキー・ビット (sticky bit) (削除制限フラグ、 unlink(2) の説明を参照)
所有者による読み取り
所有者による書き込み
所有者による実行 (execute) / 検索 (search) (「検索」はディレクトリに対して適用されるもので、 そのディレクトリ内のエントリーへアクセスできるかを意味する)
グループによる読み取り
グループによる書き込み
グループによる実行 / 検索
他人 (others) による読み取り
他人による書き込み
他人による実行 / 検索

呼び出したプロセスの実効 (effective) UID がファイルの所有者と一致するか、 そのプロセスが特権を持たなければならない (Linux では CAP_FOWNER ケーパビリティ (capability) を持たなければならない)。

呼び出したプロセスに特権がなく (Linux では CAP_FSETID ケーパビリティがなく)、かつファイルのグループ ID が プロセスの実効グループ ID または補助的なグループ ID にマッチしない場合、 S_ISGID ビットはオフにされるが、これによってエラーが返されることはない。

安全のための処置として、 ファイル・システムによっては、ファイルの書き込みを行う時に セット・ユーザー ID とセット・グループ ID ビットと実行ビットが オフにされることがある。 (Linux では、書き込みプロセスが CAP_FSETID ケーパビリティを持っていない場合に、これが起こる。) ファイル・システムの中には、スーパー・ユーザーだけが 特別の意味を持つスティッキー・ビットを設定できるものがある。 スティッキー・ビットとディレクトリに対する セット・ユーザー (グループ)・ID ビットについては、 stat(2) を見よ。

NFS ファイルシステム上では、パーミッションを制限すると、 既にオープンされているファイルに対してすぐに影響が及ぶ。 これはアクセス制御がサーバー上で行われているが、 オープンされているファイルはクライアント側で管理されているためである。 クライアント側でファイル属性のキャッシュが有効になっている場合に、 パーミッションの制限を緩くすると、 他のクライアントに情報が伝わるのが遅れるかもしれない。

返り値

成功すると、0 を返す。失敗すると、-1を返し、 errno に適切な値を設定する。

エラー

ファイル・システムによっては他のエラーを返す場合がある。 chmod() で一般的なエラーを以下に挙げる。

パス名の構成要素に検索許可がない (path_resolution(7) も見よ)。
path が割り当てられたアドレス空間外を指している。
I/O エラーが発生した。
path を解決する際に遭遇したシンボリック・リンクが多過ぎる。
path が長過ぎる。
ファイルが存在しない。
カーネルに十分なメモリがない。
パス名の構成要素がディレクトリではない。
実効 UID がファイルの所有者と一致せず、プロセスに特権がない (Linux では CAP_FOWNER ケーパビリティを持たない)。
ファイルが読み込み専用 (read only) のファイル・システム上にある。

fchmod() で一般的なエラーを挙げる:

ファイル・ディスクリプター fd が有効でない。
上記を参照。
上記を参照。
上記を参照。

準拠

4.4BSD, SVr4, POSIX.1-2001.

関連項目

chown(2), execve(2), fchmodat(2), open(2), stat(2), path_resolution(7)

2008-05-26 Linux